const obj = {
  name: "Shae",
  sayHi1: () => {
    console.log(this.name);
  },
  sayHi2() {
    (() => {
      console.log(this.name);
    })();
  },
};

obj.sayHi1(); // 浏览器打印：''，node打印：undefined
obj.sayHi2(); // 浏览器打印：Shae，node打印：Shae

const products = [
  { name: "XiaoMi", stock: 2000 },
  { name: "Apple", stock: 1000 },
  { name: "HuaWei", stock: 3000 },
];

// 上面的所有对象不可更改，得到一个新数组，Apple库存减一，尽量用一行代码解决
const newProducts = products.map((p) =>
  p.name === "Apple" ? { ...p, stock: p.stock - 1 } : p
);

function getItems(fruitList, ...args, favoriteFruit) {
    return [...fruitList, ...args, favoriteFruit]
}

// 下面的函数调用结果是什么
getItems(['banana', 'apple'], 'pear', 'orange')  // 报错，因为第二个参数要放在最后

/**
 * 函数柯里化
 * 将多参数函数转换成单参数函数的形式，逐步接收参数，当所有参数都接收完毕后执行原函数。
 * @param {Function} fn - 需要被柯里化的原始函数。
 * @param {...any} args - 初始传入的参数，用于逐步积累。
 * @returns {Function} - 返回一个柯里化后的函数，该函数可继续接收参数，直到参数满足原函数要求后执行原函数。
 */
function currying(fn, ...args) {
    return function (...args2) {
        // 当累计参数数量达到或超过原函数参数数量时，执行原函数。
        if (args.length + args2.length >= fn.length) {
            return fn(...args, ...args2)
        } else {
            // 否则，返回一个新的柯里化函数，用于继续接收参数。
            return currying(fn, ...args, ...args2)
        }
    }
}

const sum = (a, b, c, d) => a + b + c + d;

console.log(currying(sum)(1)(2)(3)(4)); // 10
console.log(currying(sum)(1, 2)(3, 4)); // 10
console.log(currying(sum)(1, 2, 3, 4));
console.log(currying(sum)(1)(2, 3, 4));
console.log(currying(sum)(1, 2, 3)(4));
console.log(currying(sum)(1, 2)(3)(4));